home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / igo / src / cell.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  3KB  |  151 lines

  1. #define DEBUG 0
  2. /* 
  3.     TOWNS囲碁棋譜記録プログラム
  4.                                           1992/07/22  久保田俊也
  5.  
  6.     92/07/22        kifuデ-タのセルを操作する関数の集まり 
  7.                 現在のバ-ジョンはMAX_TE_NUMBER以上のデ-タを要求すると
  8.                 NULLを返す
  9.                 
  10.  
  11. */
  12. #include <stdlib.h>
  13. #include "igo.h"
  14. #include "ban19.h"
  15. #include "kiffile.h"
  16.  
  17. static TE cell[MAX_TE_NUMBER];
  18. static TE *free_p;
  19. static int te_arg_no=0;
  20.  
  21. cell_init()
  22. {
  23. int i;
  24.  
  25.     for(i=0;i<MAX_TE_NUMBER-1;i++){
  26.         cell[i].next = &cell[i+1];
  27.         cell[i].iro  = FREE_CELL; /* free_cell の意味で使っている */
  28.     }
  29.     cell[MAX_TE_NUMBER-1].next = NULL;
  30.     cell[MAX_TE_NUMBER-1].iro  = FREE_CELL; /* free_cell の意味で使っている */
  31.  
  32.     free_p = &cell[0];
  33.     return 0;
  34.     
  35. }
  36.  
  37. TE *cell_get()
  38. {
  39. TE *wk_te;
  40.  
  41.     if(free_p == NULL){
  42.         return NULL;
  43.     }else{
  44.         wk_te = free_p;
  45.         free_p = free_p->next;
  46.         return wk_te;
  47.     }
  48.  
  49. }
  50.  
  51. cell_free(TE *p)
  52. {
  53.  
  54.     p->next = free_p;
  55.     p->iro  = FREE_CELL;
  56.     free_p = p;
  57.     return 0;
  58. }
  59.  
  60. TE_ARG cell_read()
  61. {
  62. TE_ARG te_arg;
  63.  
  64.     while(cell[te_arg_no].iro  == FREE_CELL){
  65.         if( te_arg_no > MAX_TE_NUMBER-1){
  66.             te_arg_no = 0;
  67.             te_arg.no = -1;
  68.             return (te_arg);
  69.         }
  70.         te_arg_no++;
  71.     }
  72.  
  73.     if( te_arg_no > MAX_TE_NUMBER-1){
  74.         te_arg_no = 0;
  75.         te_arg.no = -1;
  76.         return (te_arg);
  77.     }
  78.  
  79.     te_arg.no      = te_arg_no;
  80.     if(cell[te_arg_no].prev == NULL){
  81.         te_arg.prev = -1;
  82.     }else{
  83.         te_arg.prev    = cell[te_arg_no].prev - &cell[0];
  84.     }
  85.     if(cell[te_arg_no].next == NULL){
  86.         te_arg.next = -1;
  87.     }else{
  88.         te_arg.next    = cell[te_arg_no].next - &cell[0];
  89.     }
  90.     if(cell[te_arg_no].brother == NULL){
  91.         te_arg.brother = -1;
  92.     }else{
  93.         te_arg.brother    = cell[te_arg_no].brother - &cell[0];
  94.     }
  95.     te_arg.iro     = cell[te_arg_no].iro;
  96.     te_arg.ichi    = cell[te_arg_no].ichi;
  97.     te_arg.comment = cell[te_arg_no].comment;
  98.     te_arg_no++;
  99.  
  100.     return (te_arg);
  101. }
  102.  
  103. int cell_write(TE_ARG te_arg)
  104. {
  105. static int i;
  106.  
  107.     if (te_arg.no > MAX_TE_NUMBER-1){
  108.         return (-1);
  109.     }
  110.  
  111.     i               = te_arg.no;
  112.     if(te_arg.prev == -1){
  113.         cell[i].prev    = NULL;
  114.     }else{
  115.         cell[i].prev    = te_arg.prev + &cell[0];
  116.     }
  117.     if(te_arg.next == -1){
  118.         cell[i].next    = NULL;
  119.     }else{
  120.         cell[i].next    = te_arg.next + &cell[0];
  121.     }
  122.     if(te_arg.brother == -1){
  123.         cell[i].brother   = NULL;
  124.     }else{
  125.         cell[i].brother   = te_arg.brother + &cell[0];
  126.     }
  127.     cell[i].iro     = te_arg.iro;
  128.     cell[i].ichi    = te_arg.ichi;
  129.     cell[i].comment = te_arg.comment;
  130.  
  131.     return (0);
  132. }
  133.  
  134. int cell_write_finish()
  135. {
  136. int i;
  137. TE *wk_p;
  138.  
  139.     wk_p = NULL;
  140.     for(i=0;i<MAX_TE_NUMBER;i++){
  141.         if(cell[MAX_TE_NUMBER-i-1].iro == FREE_CELL){
  142.             cell[MAX_TE_NUMBER-i-1].next = wk_p;
  143.             wk_p         = &cell[MAX_TE_NUMBER-i-1];
  144.         }
  145.     }
  146.  
  147.     free_p = wk_p;
  148.  
  149.     return (0);
  150. }
  151.